package br.com.leopard.erp.gym.dao.base_sistema;

import java.util.Calendar;
import java.util.List;

import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.Query;

import br.com.leopard.erp.gym.exception.NenhumResultadoEncontradoException;
import br.com.leopard.erp.gym.mapeamento.base_sistema.Perfil;
import br.com.leopard.erp.gym.mapeamento.base_sistema.Usuario;
import br.com.leopard.erp.gym.mapeamento.empresa.Empresa;
import br.com.leopard.erp.gym.persistence.AbstractDAO;
import br.com.leopard.erp.gym.persistence.ParametroQueryBuilder;
import br.com.leopard.erp.gym.persistence.ParametroUtils;

@Stateless
@LocalBean
public class UsuarioDAO extends AbstractDAO<Usuario, Long> {

	public UsuarioDAO() {
		super(Usuario.class);
	}

	public Usuario getUsuariosPorLogin(String login) throws NenhumResultadoEncontradoException {
		String query = "Usuario.findByNomeUsuario";

		ParametroQueryBuilder builder = new ParametroQueryBuilder();
		builder.addParametro("login", login);

		return super.getSingleObject(query, builder.getParametros());
	}

	public List<Usuario> getUsuariosPorLoginEIDDiferente(String login, Long idUsuario) {
		String query = "Usuario.findByUsuarioEIDUsuarioDiferente";

		ParametroQueryBuilder builder = new ParametroQueryBuilder();
		builder.addParametro("login", login);
		builder.addParametro("idUsuario", idUsuario);

		return super.listNamedQuery(query, builder.getParametros());
	}

	public List<Usuario> listarPorEmpresa(Empresa empresa) {
		String query = "Usuario.findUsuarioByEmpresa";

		ParametroQueryBuilder builder = new ParametroQueryBuilder();
		builder.addParametro("empresa", empresa);

		return super.listNamedQuery(query, builder.getParametros());
	}

	public List<Usuario> listarPorPerfil(Perfil perfil) {
		String query = "Usuario.findUsuarioByPerfil";

		ParametroQueryBuilder builder = new ParametroQueryBuilder();
		builder.addParametro("perfil", perfil);

		return super.listNamedQuery(query, builder.getParametros());
	}

	public List<Usuario> listarPorPerfilEEmpresa(Perfil perfil, Empresa empresa) {
		String query = "Usuario.findUsuarioByPerfilEmpresa";

		ParametroQueryBuilder builder = new ParametroQueryBuilder();
		builder.addParametro("perfil", perfil);
		builder.addParametro("empresa", empresa);

		return super.listNamedQuery(query, builder.getParametros());
	}

	public List<Usuario> listUsuariosDeEmpresa(Empresa empresa, Long... idsUsuariosIgnorados) {
		String query = "Usuario.findUsuarioByEmpresaExcetoIDS";

		ParametroQueryBuilder builder = new ParametroQueryBuilder();
		builder.addParametro("empresa", empresa);
		builder.addParametro("ids", ParametroUtils.converterParaIn(idsUsuariosIgnorados));

		return super.listNamedQuery(query, builder.getParametros());
	}

	public List<Usuario> getUsuariosPorEmail(String email) {
		String query = "Usuario.findByEmail";

		ParametroQueryBuilder builder = new ParametroQueryBuilder();
		builder.addParametro("email", email);

		return super.listNamedQuery(query, builder.getParametros());
	}

	public List<Usuario> getUsuariosPorEmailEIDDiferenteDe(String email, Long idUsuario) {
		String query = "Usuario.findByEmailEIDUsuarioDiferente";

		ParametroQueryBuilder builder = new ParametroQueryBuilder();
		builder.addParametro("email", email);
		builder.addParametro("idUsuario", idUsuario);

		return super.listNamedQuery(query, builder.getParametros());
	}

	public Usuario getUsuario(String login, String senha) throws NenhumResultadoEncontradoException {
		String query = "Usuario.findUsuarioAtivo";

		ParametroQueryBuilder builder = new ParametroQueryBuilder();
		builder.addParametro("login", login);
		builder.addParametro("senha", senha);
		builder.addParametro("ativo", true);

		return super.getSingleObject(query, builder.getParametros());
	}

	public void alterarDataUltimoAcesso(Usuario usuario) {
		String sqlQuery = "UPDATE PMS_USUARIO SET DATA_ULTIMO_ACESSO=:dataUltimoAcesso WHERE ID_USUARIO=:idUsuario";

		Query query = super.entityManager.createNativeQuery(sqlQuery);
		query.setParameter("idUsuario", usuario.getIdUsuario());
		query.setParameter("dataUltimoAcesso", Calendar.getInstance().getTime());

		query.executeUpdate();
	}
}
